/*
 * parserNuevo.cpp
 *
 *  Created on: 30/01/2014
 *      Author: emi
 */
#include "parserNuevo.h"

#include "graph.h"
#include "parametros.h"

#include <string.h>
#include <stdio.h>
#include <iostream>
#include <fstream>

#include <math.h>

using namespace std;

float distanciaPuntos(float x1, float y1, float x2, float y2) {
    return sqrt((x1 - x2)*(x1 - x2)+(y1 - y2)*(y1 - y2));
}

Graph* parserTsp(char* rutaArchivo, const char* nombre) {
    
    Graph* g = NULL;
    char rutaCompleta[200];
    //sprintf(rutaCompleta, "%s%s", ruta, rutaArchivo); //ruta viene de parametros.h
    sprintf(rutaCompleta, "%s/familias/%s", rutaArchivo,nombre); //ruta viene de parametros.h
    ifstream myfile(rutaCompleta);
    string line;
    float* posX; //FIXME la posicion podria ser float
    float* posY;
    int dim;

    if (myfile.is_open() && myfile.good()) {
        while (!myfile.eof()) {
            getline(myfile, line);
            //cout << "- " << line << " ** Da bola " << endl;
            //parserTSP(line, myfile);
            if (line.find(DIMENSION) != string::npos) {
                sscanf(line.data(), "%*s%d", &dim);
                //ya tengo la cantidad de nodos del grafo => LO CREO!!!
                g = new Graph(dim);
                posX = new float[dim];
                posY = new float[dim];
            }
            if (line.find(NODE_COORD_SECTION) != string::npos) {
                if (g == NULL) return g;
                getline(myfile, line);
                int nodo, nodo_arch, cont;
                float x, y;
                cont = 0;
                do {
                    char* str_nodo = new char[200];
                    strcpy(str_nodo, line.data());
                    sscanf(str_nodo, "%d  %f %f", &nodo_arch, &x, &y);
                    nodo=nodo_arch-1;
                    //guardo su posicion en el plano
                    posX[nodo] = x;
                    posY[nodo] = y;
                    g->actived_node[nodo]=1;
                    g->W[nodo]=0;
                    if (sorteoTerminal()) {
                        g->T->push_front(nodo);
                        g->_T[nodo] = 1;
                    }
                    for (int i = 0; i < cont; i++) {
                        //calculo la distancia contra el resto de los nodos
                        float dist = distanciaPuntos(posX[nodo], posY[nodo], posX[i], posY[i]);
                        g->agregarArista(i, nodo, (int) dist);
                    }
                    getline(myfile, line);
                    cont++;
                } while (line.compare("EOF") != 0);
            }
        }
        myfile.close();
    } else cout << "Unable to open file" << rutaArchivo;
    return g;
}






